gtkpointerfocus: Add methods to handle implicit grabs on widgets
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 31 Mar 2017 15:57:44 +0000 (17:57 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 25 May 2017 14:25:58 +0000 (16:25 +0200)
Just a basic setter/getter, plus a method to obtain the right logical target
in the presence or absence of these.

gtk/gtkpointerfocus.c
gtk/gtkpointerfocusprivate.h

index 7c522a0dd0fd5847912d17629b4cf9f682d49777..3a4026d3d55e4d5973d9083fb8a4392b334666d9 100644 (file)
@@ -78,6 +78,19 @@ gtk_pointer_focus_get_target (GtkPointerFocus *focus)
   return focus->target;
 }
 
+void
+gtk_pointer_focus_set_implicit_grab (GtkPointerFocus *focus,
+                                     GtkWidget       *grab_widget)
+{
+  focus->grab_widget = grab_widget;
+}
+
+GtkWidget *
+gtk_pointer_focus_get_implicit_grab (GtkPointerFocus *focus)
+{
+  return focus->grab_widget;
+}
+
 void
 gtk_pointer_focus_set_coordinates (GtkPointerFocus *focus,
                                    gdouble          x,
@@ -87,6 +100,21 @@ gtk_pointer_focus_set_coordinates (GtkPointerFocus *focus,
   focus->y = y;
 }
 
+GtkWidget *
+gtk_pointer_focus_get_effective_target (GtkPointerFocus *focus)
+{
+  GtkWidget *target;
+
+  target = focus->target;
+
+  if (focus->grab_widget &&
+      focus->grab_widget != target &&
+      !gtk_widget_is_ancestor (target, focus->grab_widget))
+    target = focus->grab_widget;
+
+  return target;
+}
+
 void
 gtk_pointer_focus_repick_target (GtkPointerFocus *focus)
 {
index 56735d8dcd9def752d811b05a3c80b05923d1e1e..5d5be955e0fc8c1217ef98035f94020bfe44e80f 100644 (file)
@@ -47,6 +47,12 @@ void              gtk_pointer_focus_set_target      (GtkPointerFocus *focus,
                                                      GtkWidget       *target);
 GtkWidget *       gtk_pointer_focus_get_target      (GtkPointerFocus *focus);
 
+void              gtk_pointer_focus_set_implicit_grab (GtkPointerFocus *focus,
+                                                       GtkWidget       *grab_widget);
+GtkWidget *       gtk_pointer_focus_get_implicit_grab (GtkPointerFocus *focus);
+
+GtkWidget *       gtk_pointer_focus_get_effective_target (GtkPointerFocus *focus);
+
 void              gtk_pointer_focus_repick_target (GtkPointerFocus *focus);
 
 #endif /* _GTK_POINTER_FOCUS_PRIVATE_H_ */